/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.persistance.formation;

import java.io.FileInputStream;
import java.util.Date;
import java.util.Properties;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.entity.formation.Inscription;
import net.etrs.formathlon.entity.formation.Participation;
import net.etrs.formathlon.entity.utilisateur.Personnel;
import net.etrs.formathlon.entity.utilisateur.Utilisateur;
import net.etrs.formathlon.metier.exception.MetierException;
import net.etrs.formathlon.metier.utils.DateUtils;
import net.etrs.formathlon.metier.utils.FileUtils;
import net.etrs.formathlon.metier.utils.pdf.PDFManager;
import net.etrs.formathlon.persistance.utils.AbstractFacade;
import net.etrs.formathlon.persistance.utils.JpaRequestNames;

/**
 * Facade pour la gestion de l'entité Participation.
 * @author OPIF
 */
@Stateless
public class ParticipationFacade extends AbstractFacade<Participation> {

    /**
     * Permet la création du pdf pour l'attestation de formation.
     * @param utilisateur
     * @param dateDebut
     * @param dateFin
     * @return
     * @throws MetierException 
     */
    public FileInputStream getAttestation(Utilisateur utilisateur, Date dateDebut, Date dateFin) throws MetierException {
        try {
            Properties prop = FileUtils.getConfigProperties(this.getClass());
            String file = PDFManager.generateAttestation(utilisateur, prop, dateDebut, dateFin);
            return new FileInputStream(file);
        } catch (Exception ex) {
            throw new MetierException(MetierException.Type.PDF_ATTESTATION_ERREUR_TECHNIQUE, ex);
        }
    }

    /**
     * Pour le parcours pédagogique.
     * Date ou non de la participation de la personne à la formation.
     * @param pers
     * @param formation
     * @return 
     */
    public String aEueLieu(Personnel pers, Formation formation) {
        try {
            Participation participation = (Participation) getEm().createNamedQuery(JpaRequestNames.PARTICIPATION_A_EUE_LIEU).setParameter("personnel", pers).setParameter("formation", formation).getSingleResult();
            return DateUtils.getDateFormatee(participation.getDateFormation());
        } catch (NoResultException ex) {
            return "-";
        } catch (NonUniqueResultException ex) {
            return "-";
        }
    }

    /**
     * La création de la participation se base sur les informations
     * de l'inscription de la session.
     * @param inscription
     * @return 
     */
    public Participation newInstance(Inscription inscription){
        Participation participation = super.newInstance();
        participation.setDateFormation(inscription.getSession().getDateDebut());
        participation.setFormation(inscription.getSession().getFormation());
        participation.setPersonnel(inscription.getPersonnel());
        return participation;
    }
    

    /**
     * Le nombre de participation de la formation.
     * Pour les statistiques.
     * @param formation
     * @return 
     */
    public Long getNbParticipations(Formation formation){
        return (Long) getEm().createNamedQuery(JpaRequestNames.NB_PARTICIPATIONS_POUR_FORMATION)
                .setParameter("formation", formation)
                .getSingleResult();
    }

    /**
     * Renvoie la participation si elle existe deja pour mettre à jour la date de la participation.
     * @param pers
     * @param formation
     * @return 
     */
    public Participation getParticipation(Personnel pers, Formation formation) {
        try {
            return (Participation) getEm().createNamedQuery(JpaRequestNames.PARTICIPATION_A_EUE_LIEU).setParameter("personnel", pers).setParameter("formation", formation).getSingleResult();
        } catch (NoResultException ex) {
            return null;
        } catch (NonUniqueResultException ex) {
            return null;
        }
                
    }
}
